{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 第三章 - 尝试解决一个实际问题\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "目录：\n",
    "* 3.1 加载 MNIST 数据集\n",
    "* 3.2 定义模型\n",
    "* 3.3 选择损失函数和优化器\n",
    "* 3.4 模型训练并验证\n",
    "* 3.5 可视化验证"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，让我们依靠计图的强大力量，解决你的第一个实际问题吧！  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;2m[i 0202 23:00:55.471709 24 compiler.py:847] Jittor(1.2.2.27) src: /home/llt/.local/lib/python3.7/site-packages/jittor\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.473366 24 compiler.py:848] g++ at /usr/bin/g++\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.474573 24 compiler.py:849] cache_path: /home/llt/.cache/jittor/default/g++\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.489276 24 __init__.py:257] Found /usr/local/cuda/bin/nvcc(10.2.89) at /usr/local/cuda/bin/nvcc.\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.567521 24 __init__.py:257] Found gdb(8.1.0) at /usr/bin/gdb.\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.583515 24 __init__.py:257] Found addr2line(2.30) at /usr/bin/addr2line.\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.632399 24 compiler.py:889] pybind_include: -I/usr/include/python3.7m -I/usr/local/lib/python3.7/dist-packages/pybind11/include\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.657575 24 compiler.py:891] extension_suffix: .cpython-37m-x86_64-linux-gnu.so\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:55.868891 24 __init__.py:169] Total mem: 62.78GB, using 16 procs for compiling.\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.064987 24 jit_compiler.cc:21] Load cc_path: /usr/bin/g++\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.261122 24 init.cc:54] Found cuda archs: [75,]\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.443019 24 __init__.py:257] Found mpicc(2.1.1) at /usr/bin/mpicc.\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.511110 24 compiler.py:654] handle pyjt_include/home/llt/.local/lib/python3.7/site-packages/jittor/extern/mpi/inc/mpi_warper.h\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.556598 24 compile_extern.py:287] Downloading nccl...\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.632489 24 compile_extern.py:16] found /usr/local/cuda/include/cublas.h\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:56.634748 24 compile_extern.py:16] found /usr/lib/x86_64-linux-gnu/libcublas.so\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:57.221814 24 compile_extern.py:16] found /usr/local/cuda/include/cudnn.h\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:57.223031 24 compile_extern.py:16] found /usr/local/cuda/lib64/libcudnn.so\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:57.255155 24 compiler.py:654] handle pyjt_include/home/llt/.local/lib/python3.7/site-packages/jittor/extern/cuda/cudnn/inc/cudnn_warper.h\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:59.305098 24 compile_extern.py:16] found /usr/local/cuda/include/curand.h\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:59.306353 24 compile_extern.py:16] found /usr/local/cuda/lib64/libcurand.so\u001b[m\n",
      "\u001b[38;5;2m[i 0202 23:00:59.338311 24 cuda_flags.cc:26] CUDA enabled.\u001b[m\n"
     ]
    }
   ],
   "source": [
    "# 加载计图\n",
    "import jittor as jt\n",
    "\n",
    "# 开启 GPU 加速\n",
    "jt.flags.use_cuda = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 任务：使用 Jittor 对 MNIST 手写数字进行识别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**任务描述如下：**  \n",
    "* MNIST 手写数字数据库，主要收集了不同人群真实的手写数字记录（包括 0 到 9 十个数字）。该数据库包含训练集上 60,000 个示例，和测试集上 10,000 个示例。数据库详细信息可见：http://yann.lecun.com/exdb/mnist/ \n",
    "\n",
    "\n",
    "* MNIST 手写数字示例： \n",
    "\n",
    "<!-- ![avatar](mnist.png) -->\n",
    "<!-- ![mnist.png](attachment:mnist.png) -->\n",
    "<img  src=\"mnist.png\" width=600 height=600>\n",
    "\n",
    "* 目标：利用 Jittor 对 MNIST 手写数字进行识别，辨认出手写数字所要表达的真实数字值。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**解决步骤如下：**\n",
    "1.  通过 Jittor 加载 MNIST 手写数字的 **数据集**；\n",
    "\n",
    "\n",
    "2.  定义 **模型** ：设计卷积神经网络；  \n",
    "\n",
    "\n",
    "3.  选择合适的 **损失函数** 和 **优化器**；  \n",
    "\n",
    "\n",
    "4.  完成模型 **训练** 并 **验证** 的主代码块。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 加载 MNIST 数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于 MNIST 是一个常见的数据集，为方便使用，其数据已经被封装进 Jittor。我们可以直接调用 MNIST 类，来加载需要的数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from jittor.dataset.mnist import MNIST\n",
    "import jittor.transform as trans\n",
    "\n",
    "# 设置超参数 batch_size，其值代表一个批次中含有多少个数据。\n",
    "batch_size = 64\n",
    "\n",
    "# 创建 MNIST 训练集数据加载器\n",
    "train_loader = MNIST(train=True, transform=trans.Resize(28)).set_attrs(batch_size=batch_size, shuffle=True)\n",
    "# 创建 MNIST 测试集数据加载器\n",
    "val_loader = MNIST(train=False, transform=trans.Resize(28)).set_attrs(batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了更好地了解 MNIST 手写数字数据集，现在，我们尝试将数据进行可视化展示。  \n",
    "以测试集数据为例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "inputs.shape: [64,3,28,28,]\n",
      "targets.shape: [64,]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAM3UlEQVR4nO3db6wU9b3H8c/nUpoY6QPwDzmhKL3EJ+QmwhWJCXhzDGmD+AAbiSkPGm7SePoATBsbco33AT5sTP/k+sAmp9GUNlwbEqoSYywUG0mjNh4NygECIkEB+WODScHEIPbbB2dsjrg7u+7M7ix836/kZHfnuzPzzcjHmZ3Z2Z8jQgCufv/WdAMABoOwA0kQdiAJwg4kQdiBJL42yJXZ5tQ/0GcR4VbTK+3Zba+yfcj2EdsPV1kWgP5yr9fZbc+QdFjStyWdkPS6pHURcaBkHvbsQJ/1Y8++TNKRiDgaERcl/V7SmgrLA9BHVcI+T9Lxaa9PFNO+wPaY7QnbExXWBaCivp+gi4hxSeMSh/FAk6rs2U9Kmj/t9TeLaQCGUJWwvy7pFtvfsv11Sd+TtKOetgDUrefD+Ii4ZHujpD9KmiHpqYjYX1tnAGrV86W3nlbGZ3ag7/rypRoAVw7CDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJAg7kARhB5Ig7EAShB1IgrADSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBI9j88uSbaPSTov6TNJlyJiaR1NAahfpbAX7oqIv9WwHAB9xGE8kETVsIeknbbfsD3W6g22x2xP2J6ouC4AFTgiep/ZnhcRJ23fKGmXpAcjYk/J+3tfGYCuRIRbTa+0Z4+Ik8XjWUnPSFpWZXkA+qfnsNu+1vY3Pn8u6TuSJutqDEC9qpyNnyvpGdufL+f/I+LFWroCULtKn9m/8sr4zA70XV8+swO4chB2IAnCDiRB2IEkCDuQRB03wqSwdu3atrUHHnigdN4PPvigtP7JJ5+U1rdu3VpaP336dNvakSNHSudFHuzZgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJ7nrr0tGjR9vWFixYMLhGWjh//nzb2v79+wfYyXA5ceJE29pjjz1WOu/ExJX7K2rc9QYkR9iBJAg7kARhB5Ig7EAShB1IgrADSXA/e5fK7lm/9dZbS+c9cOBAaX3RokWl9SVLlpTWR0dH29buuOOO0nmPHz9eWp8/f35pvYpLly6V1j/88MPS+sjISM/rfv/990vrV/J19nbYswNJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEtzPfhWYPXt221qna/SdrifffvvtPfXUjU6/l3/48OHS+sGDB0vrc+bMaVvbuHFj6bxPPPFEaX2Y9Xw/u+2nbJ+1PTlt2hzbu2y/Uzy2/9cGYCh0cxj/G0mrLpv2sKTdEXGLpN3FawBDrGPYI2KPpHOXTV4jaUvxfIuke2vuC0DNev1u/NyIOFU8Py1pbrs32h6TNNbjegDUpPKNMBERZSfeImJc0rjECTqgSb1eejtje0SSisez9bUEoB96DfsOSeuL5+slPVdPOwD6peN1dttPSxqVdL2kM5I2S3pW0jZJN0l6T9L9EXH5SbxWy+IwHl277777Suvbtm0rrU9OTrat3XXXXaXznjvX8Z/z0Gp3nb3jZ/aIWNemtLJSRwAGiq/LAkkQdiAJwg4kQdiBJAg7kAS3uKIxN954Y2l93759leZfu3Zt29r27dtL572SMWQzkBxhB5Ig7EAShB1IgrADSRB2IAnCDiTBkM1ozIYNG0rrN9xwQ2n9o48+Kq0fOnToK/d0NWPPDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJcD87+mr58uVtay+99FLpvDNnziytj46Oltb37NlTWr9acT87kBxhB5Ig7EAShB1IgrADSRB2IAnCDiTB/ezoq9WrV7etdbqOvnv37tL6q6++2lNPWXXcs9t+yvZZ25PTpj1q+6TtvcVf+/+iAIZCN4fxv5G0qsX0X0bE4uLvhXrbAlC3jmGPiD2Szg2gFwB9VOUE3UbbbxeH+bPbvcn2mO0J2xMV1gWgol7D/itJCyUtlnRK0s/bvTEixiNiaUQs7XFdAGrQU9gj4kxEfBYR/5D0a0nL6m0LQN16CrvtkWkvvytpst17AQyHjtfZbT8taVTS9bZPSNosadT2Ykkh6ZikH/axRwyxa665prS+alWrCzlTLl68WDrv5s2bS+uffvppaR1f1DHsEbGuxeQn+9ALgD7i67JAEoQdSIKwA0kQdiAJwg4kwS2uqGTTpk2l9SVLlrStvfjii6XzvvLKKz31hNbYswNJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEgzZjFL33HNPaf3ZZ58trX/88cdta3fffXfpvPxUdG8YshlIjrADSRB2IAnCDiRB2IEkCDuQBGEHkuB+9uSuu+660vrjjz9eWp8xY0Zp/YUX2o/5yXX0wWLPDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJcD/7Va7TdfDXXnuttH7bbbeV1t99993SetmQzZ3mRW96vp/d9nzbf7Z9wPZ+2z8qps+xvcv2O8Xj7LqbBlCfbg7jL0n6SUQsknSHpA22F0l6WNLuiLhF0u7iNYAh1THsEXEqIt4snp+XdFDSPElrJG0p3rZF0r39ahJAdV/pu/G2F0haIumvkuZGxKmidFrS3DbzjEka671FAHXo+my87VmStkv6cUT8fXotps7ytTz5FhHjEbE0IpZW6hRAJV2F3fZMTQV9a0T8oZh8xvZIUR+RdLY/LQKoQ8fDeNuW9KSkgxHxi2mlHZLWS/pp8fhcXzpEJQsXLiytd7q01slDDz1UWufy2vDo5jP7cknfl7TP9t5i2iOaCvk22z+Q9J6k+/vTIoA6dAx7RPxFUsuL9JJW1tsOgH7h67JAEoQdSIKwA0kQdiAJwg4kwU9JXwVuvvnmtrWdO3dWWvamTZtK688//3yl5WNw2LMDSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBJcZ78KjI21/9Wvm266qdKyX3755dL6IH+KHNWwZweSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJLjOfgW48847S+sPPvjggDrBlYw9O5AEYQeSIOxAEoQdSIKwA0kQdiAJwg4k0c347PMl/VbSXEkhaTwi/s/2o5IekPRh8dZHIuKFfjWa2YoVK0rrs2bN6nnZncZPv3DhQs/LxnDp5ks1lyT9JCLetP0NSW/Y3lXUfhkRP+tfewDq0s347KcknSqen7d9UNK8fjcGoF5f6TO77QWSlkj6azFpo+23bT9le3abecZsT9ieqNQpgEq6DrvtWZK2S/pxRPxd0q8kLZS0WFN7/p+3mi8ixiNiaUQsraFfAD3qKuy2Z2oq6Fsj4g+SFBFnIuKziPiHpF9LWta/NgFU1THsti3pSUkHI+IX06aPTHvbdyVN1t8egLp0czZ+uaTvS9pne28x7RFJ62wv1tTluGOSftiXDlHJW2+9VVpfuXJlaf3cuXN1toMGdXM2/i+S3KLENXXgCsI36IAkCDuQBGEHkiDsQBKEHUiCsANJeJBD7tpmfF+gzyKi1aVy9uxAFoQdSIKwA0kQdiAJwg4kQdiBJAg7kMSgh2z+m6T3pr2+vpg2jIa1t2HtS6K3XtXZ283tCgP9Us2XVm5PDOtv0w1rb8Pal0RvvRpUbxzGA0kQdiCJpsM+3vD6ywxrb8Pal0RvvRpIb41+ZgcwOE3v2QEMCGEHkmgk7LZX2T5k+4jth5vooR3bx2zvs7236fHpijH0ztqenDZtju1dtt8pHluOsddQb4/aPllsu722VzfU23zbf7Z9wPZ+2z8qpje67Ur6Gsh2G/hndtszJB2W9G1JJyS9LmldRBwYaCNt2D4maWlENP4FDNv/JemCpN9GxH8U0x6TdC4iflr8j3J2RPzPkPT2qKQLTQ/jXYxWNDJ9mHFJ90r6bzW47Ur6ul8D2G5N7NmXSToSEUcj4qKk30ta00AfQy8i9ki6fEiWNZK2FM+3aOofy8C16W0oRMSpiHizeH5e0ufDjDe67Ur6Gogmwj5P0vFpr09ouMZ7D0k7bb9he6zpZlqYGxGniuenJc1tspkWOg7jPUiXDTM+NNuul+HPq+IE3ZetiIj/lHS3pA3F4epQiqnPYMN07bSrYbwHpcUw4//S5LbrdfjzqpoI+0lJ86e9/mYxbShExMni8aykZzR8Q1Gf+XwE3eLxbMP9/MswDePdaphxDcG2a3L48ybC/rqkW2x/y/bXJX1P0o4G+vgS29cWJ05k+1pJ39HwDUW9Q9L64vl6Sc812MsXDMsw3u2GGVfD267x4c8jYuB/klZr6oz8u5L+t4ke2vT175LeKv72N92bpKc1dVj3qabObfxA0nWSdkt6R9KfJM0Zot5+J2mfpLc1FayRhnpboalD9Lcl7S3+Vje97Ur6Gsh24+uyQBKcoAOSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJP4JQ6Ub9g3W1GYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "target: 7\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "num = 0                                                     # 选择展示第几个 input 数据\n",
    "for inputs, targets in val_loader:                          # 通过测试集加载器遍历每批次数据\n",
    "    print(\"inputs.shape:\", inputs.shape)                    # 查看 inputs 的形状\n",
    "    print(\"targets.shape:\", targets.shape)                  # 查看 targets 的形状\n",
    "    \n",
    "    plt.imshow(inputs[num].numpy().transpose(1, 2, 0))      # 利用 matplotlib 根据第一个 input 绘制手写数字的图像\n",
    "    plt.show()                                              # 展示图像\n",
    "    print(\"target:\", targets[num].data[0])                  # 打印第一个 input 数据的真实标签值，即手写数字图像所表达的真实数字\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过上述打印信息，可以看到：\n",
    "* 加载器每个批次的遍历，无论是 inputs 还是 targets，都包含了 64 个数据。这与我们设置的 batch_size 相符；\n",
    "\n",
    "\n",
    "* 在 inputs 中，每个数据实质为 3 个通道，每个通道包含 28\\*28 个像素点的数字集合。我们可以通过 imshow() 函数画出对应的手写数字图像；\n",
    "\n",
    "\n",
    "* targets 中的每个数据，实质为 1 个数字，即手写数字图像所表达的真实数字值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 定义模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同样，我们需要继承 Module 类，并实现 \\_\\_init__ 函数和 execute 函数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from jittor import nn, Module\n",
    "\n",
    "class Model(Module):\n",
    "    def __init__(self):\n",
    "        super(Model, self).__init__()\n",
    "        self.conv1 = nn.Conv(3, 32, 3, 1)           # 卷积层 1，参数含义：该层输入通道 3，输出通道 32，卷积核大小 3*3，移动步长为 1\n",
    "        self.conv2 = nn.Conv(32, 64, 3, 1)          # 卷积层 2，参数含义：该层输入通道 32，输出通道 64，卷积核大小 3*3，移动步长为 1\n",
    "        self.bn = nn.BatchNorm(64)                  # 批量归一化层，参数含义：该层输入通道数为 64\n",
    "\n",
    "        self.max_pool = nn.Pool(2, 2)               # 池化层，参数含义：窗口大小为 2，窗口移动步长为 2\n",
    "        self.relu = nn.Relu()                       # 非线性激活函数 Relu\n",
    "        self.fc1 = nn.Linear(64 * 12 * 12, 256)     # 线性全连接 1，参数含义：输入通道数 64*12*12（由上一步reshape变化得来），输出通道数 256\n",
    "        self.fc2 = nn.Linear(256, 10)               # 线性全连接 2，参数含义：输入通道数 256，输出通道数 10\n",
    "    \n",
    "    def execute(self, x) :\n",
    "        x = self.conv1(x)                           # 作用第一层卷积层，输入由 batch_size*3*28*28 变为输出 batch_size*32*26*26\n",
    "        x = self.relu(x)                            # 通过非线性激活函数 Relu\n",
    "        \n",
    "        x = self.conv2(x)                           # 作用第二层卷积层，输入由 batch_size*32*26*26 变为输出 batch_size*64*24*24\n",
    "        x = self.bn(x)                              # 批量归一化操作\n",
    "        x = self.relu(x)                            # 通过非线性激活函数 Relu\n",
    "\n",
    "        x = self.max_pool(x)                        # 池化操作，输入由 batch_size*64*24*24 变为输出 batch_size*64*12*12\n",
    "        x = jt.reshape(x, [x.shape[0], -1])         # 将 x 压缩成只保留第一维度，输入由 batch_size*64*12*12 变为输出 batch_size*(64*12*12)\n",
    "        x = self.fc1(x)                             # 作用第一层全连接，输入由 batch_size*(64*12*12) 变为输出 batch_size*256\n",
    "        x = self.relu(x)                            # 通过非线性激活函数 Relu\n",
    "        x = self.fc2(x)                             # 第二层全连接，并控制最后输出为 batch_size*10，每个数据的 10 个分量，分别代表十个数字的相似度\n",
    "        return x\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，我们创建一个模型实例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Model()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 选择损失函数和优化器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在本次实践中，我们采用交叉熵损失函数 CrossEntropyLoss()，以及随机梯度下降 (Stochastic Gradient Descent, SGD) 作为参数优化器。  \n",
    "这些常用的损失函数和优化器我们可以通过计图的 nn 类获取得到。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置损失函数\n",
    "loss_function = nn.CrossEntropyLoss()\n",
    "\n",
    "# 设置优化器\n",
    "learning_rate = 0.1\n",
    "momentum = 0.9\n",
    "weight_decay = 1e-4\n",
    "optimizer = nn.SGD(model.parameters(), learning_rate, momentum, weight_decay)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.4 模型训练并验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 0 [0/938 (0%)]\tLoss: 2.367674\n",
      "Train Epoch: 0 [10/938 (1%)]\tLoss: 2.302495\n",
      "Train Epoch: 0 [20/938 (2%)]\tLoss: 2.215536\n",
      "Train Epoch: 0 [30/938 (3%)]\tLoss: 0.997462\n",
      "Train Epoch: 0 [40/938 (4%)]\tLoss: 0.957385\n",
      "Train Epoch: 0 [50/938 (5%)]\tLoss: 0.932777\n",
      "Train Epoch: 0 [60/938 (6%)]\tLoss: 0.419664\n",
      "Train Epoch: 0 [70/938 (7%)]\tLoss: 0.452631\n",
      "Train Epoch: 0 [80/938 (9%)]\tLoss: 0.402917\n",
      "Train Epoch: 0 [90/938 (10%)]\tLoss: 0.428482\n",
      "Train Epoch: 0 [100/938 (11%)]\tLoss: 0.604908\n",
      "Train Epoch: 0 [110/938 (12%)]\tLoss: 0.391322\n",
      "Train Epoch: 0 [120/938 (13%)]\tLoss: 0.407544\n",
      "Train Epoch: 0 [130/938 (14%)]\tLoss: 0.389958\n",
      "Train Epoch: 0 [140/938 (15%)]\tLoss: 0.894348\n",
      "Train Epoch: 0 [150/938 (16%)]\tLoss: 0.264137\n",
      "Train Epoch: 0 [160/938 (17%)]\tLoss: 0.304531\n",
      "Train Epoch: 0 [170/938 (18%)]\tLoss: 0.083782\n",
      "Train Epoch: 0 [180/938 (19%)]\tLoss: 0.360765\n",
      "Train Epoch: 0 [190/938 (20%)]\tLoss: 0.162649\n",
      "Train Epoch: 0 [200/938 (21%)]\tLoss: 0.390720\n",
      "Train Epoch: 0 [210/938 (22%)]\tLoss: 0.625486\n",
      "Train Epoch: 0 [220/938 (23%)]\tLoss: 0.324941\n",
      "Train Epoch: 0 [230/938 (25%)]\tLoss: 0.438149\n",
      "Train Epoch: 0 [240/938 (26%)]\tLoss: 0.323761\n",
      "Train Epoch: 0 [250/938 (27%)]\tLoss: 0.349010\n",
      "Train Epoch: 0 [260/938 (28%)]\tLoss: 0.289034\n",
      "Train Epoch: 0 [270/938 (29%)]\tLoss: 0.306782\n",
      "Train Epoch: 0 [280/938 (30%)]\tLoss: 0.572093\n",
      "Train Epoch: 0 [290/938 (31%)]\tLoss: 0.184500\n",
      "Train Epoch: 0 [300/938 (32%)]\tLoss: 0.260680\n",
      "Train Epoch: 0 [310/938 (33%)]\tLoss: 0.285141\n",
      "Train Epoch: 0 [320/938 (34%)]\tLoss: 0.440616\n",
      "Train Epoch: 0 [330/938 (35%)]\tLoss: 0.283369\n",
      "Train Epoch: 0 [340/938 (36%)]\tLoss: 0.209447\n",
      "Train Epoch: 0 [350/938 (37%)]\tLoss: 0.192667\n",
      "Train Epoch: 0 [360/938 (38%)]\tLoss: 0.228336\n",
      "Train Epoch: 0 [370/938 (39%)]\tLoss: 0.172963\n",
      "Train Epoch: 0 [380/938 (41%)]\tLoss: 0.314350\n",
      "Train Epoch: 0 [390/938 (42%)]\tLoss: 0.260803\n",
      "Train Epoch: 0 [400/938 (43%)]\tLoss: 0.250771\n",
      "Train Epoch: 0 [410/938 (44%)]\tLoss: 0.398289\n",
      "Train Epoch: 0 [420/938 (45%)]\tLoss: 0.184596\n",
      "Train Epoch: 0 [430/938 (46%)]\tLoss: 0.610948\n",
      "Train Epoch: 0 [440/938 (47%)]\tLoss: 0.138442\n",
      "Train Epoch: 0 [450/938 (48%)]\tLoss: 0.213884\n",
      "Train Epoch: 0 [460/938 (49%)]\tLoss: 0.236248\n",
      "Train Epoch: 0 [470/938 (50%)]\tLoss: 0.155862\n",
      "Train Epoch: 0 [480/938 (51%)]\tLoss: 0.189624\n",
      "Train Epoch: 0 [490/938 (52%)]\tLoss: 0.110163\n",
      "Train Epoch: 0 [500/938 (53%)]\tLoss: 0.299565\n",
      "Train Epoch: 0 [510/938 (54%)]\tLoss: 0.194797\n",
      "Train Epoch: 0 [520/938 (55%)]\tLoss: 0.331710\n",
      "Train Epoch: 0 [530/938 (57%)]\tLoss: 0.051663\n",
      "Train Epoch: 0 [540/938 (58%)]\tLoss: 0.226978\n",
      "Train Epoch: 0 [550/938 (59%)]\tLoss: 0.227077\n",
      "Train Epoch: 0 [560/938 (60%)]\tLoss: 0.143331\n",
      "Train Epoch: 0 [570/938 (61%)]\tLoss: 0.322037\n",
      "Train Epoch: 0 [580/938 (62%)]\tLoss: 0.298587\n",
      "Train Epoch: 0 [590/938 (63%)]\tLoss: 0.145827\n",
      "Train Epoch: 0 [600/938 (64%)]\tLoss: 0.164992\n",
      "Train Epoch: 0 [610/938 (65%)]\tLoss: 0.181216\n",
      "Train Epoch: 0 [620/938 (66%)]\tLoss: 0.143517\n",
      "Train Epoch: 0 [630/938 (67%)]\tLoss: 0.344943\n",
      "Train Epoch: 0 [640/938 (68%)]\tLoss: 0.408126\n",
      "Train Epoch: 0 [650/938 (69%)]\tLoss: 0.236928\n",
      "Train Epoch: 0 [660/938 (70%)]\tLoss: 0.203909\n",
      "Train Epoch: 0 [670/938 (71%)]\tLoss: 0.256777\n",
      "Train Epoch: 0 [680/938 (72%)]\tLoss: 0.381356\n",
      "Train Epoch: 0 [690/938 (74%)]\tLoss: 0.249726\n",
      "Train Epoch: 0 [700/938 (75%)]\tLoss: 0.156209\n",
      "Train Epoch: 0 [710/938 (76%)]\tLoss: 0.207083\n",
      "Train Epoch: 0 [720/938 (77%)]\tLoss: 0.264972\n",
      "Train Epoch: 0 [730/938 (78%)]\tLoss: 0.089759\n",
      "Train Epoch: 0 [740/938 (79%)]\tLoss: 0.287047\n",
      "Train Epoch: 0 [750/938 (80%)]\tLoss: 0.253490\n",
      "Train Epoch: 0 [760/938 (81%)]\tLoss: 0.188711\n",
      "Train Epoch: 0 [770/938 (82%)]\tLoss: 0.182997\n",
      "Train Epoch: 0 [780/938 (83%)]\tLoss: 0.173947\n",
      "Train Epoch: 0 [790/938 (84%)]\tLoss: 0.298086\n",
      "Train Epoch: 0 [800/938 (85%)]\tLoss: 0.225113\n",
      "Train Epoch: 0 [810/938 (86%)]\tLoss: 0.036622\n",
      "Train Epoch: 0 [820/938 (87%)]\tLoss: 0.214803\n",
      "Train Epoch: 0 [830/938 (88%)]\tLoss: 0.303559\n",
      "Train Epoch: 0 [840/938 (90%)]\tLoss: 0.143316\n",
      "Train Epoch: 0 [850/938 (91%)]\tLoss: 0.078837\n",
      "Train Epoch: 0 [860/938 (92%)]\tLoss: 0.272784\n",
      "Train Epoch: 0 [870/938 (93%)]\tLoss: 0.040230\n",
      "Train Epoch: 0 [880/938 (94%)]\tLoss: 0.255706\n",
      "Train Epoch: 0 [890/938 (95%)]\tLoss: 0.257530\n",
      "Train Epoch: 0 [900/938 (96%)]\tLoss: 0.265747\n",
      "Train Epoch: 0 [910/938 (97%)]\tLoss: 0.164142\n",
      "Train Epoch: 0 [920/938 (98%)]\tLoss: 0.184068\n",
      "Train Epoch: 0 [930/938 (99%)]\tLoss: 0.103193\n",
      "Test Epoch: 0 [0/157 (0%)]\tAcc: 1.000000\n",
      "Test Epoch: 0 [10/157 (6%)]\tAcc: 0.953125\n",
      "Test Epoch: 0 [20/157 (13%)]\tAcc: 0.906250\n",
      "Test Epoch: 0 [30/157 (19%)]\tAcc: 0.906250\n",
      "Test Epoch: 0 [40/157 (25%)]\tAcc: 0.953125\n",
      "Test Epoch: 0 [50/157 (32%)]\tAcc: 0.968750\n",
      "Test Epoch: 0 [60/157 (38%)]\tAcc: 0.953125\n",
      "Test Epoch: 0 [70/157 (45%)]\tAcc: 0.937500\n",
      "Test Epoch: 0 [80/157 (51%)]\tAcc: 0.984375\n",
      "Test Epoch: 0 [90/157 (57%)]\tAcc: 1.000000\n",
      "Test Epoch: 0 [100/157 (64%)]\tAcc: 1.000000\n",
      "Test Epoch: 0 [110/157 (70%)]\tAcc: 0.984375\n",
      "Test Epoch: 0 [120/157 (76%)]\tAcc: 0.984375\n",
      "Test Epoch: 0 [130/157 (83%)]\tAcc: 0.984375\n",
      "Test Epoch: 0 [140/157 (89%)]\tAcc: 0.937500\n",
      "Test Epoch: 0 [150/157 (96%)]\tAcc: 0.953125\n",
      "Total test acc = 0.9617\n",
      "Train Epoch: 1 [0/938 (0%)]\tLoss: 0.037812\n",
      "Train Epoch: 1 [10/938 (1%)]\tLoss: 0.191765\n",
      "Train Epoch: 1 [20/938 (2%)]\tLoss: 0.118993\n",
      "Train Epoch: 1 [30/938 (3%)]\tLoss: 0.091133\n",
      "Train Epoch: 1 [40/938 (4%)]\tLoss: 0.259714\n",
      "Train Epoch: 1 [50/938 (5%)]\tLoss: 0.129380\n",
      "Train Epoch: 1 [60/938 (6%)]\tLoss: 0.126883\n",
      "Train Epoch: 1 [70/938 (7%)]\tLoss: 0.048264\n",
      "Train Epoch: 1 [80/938 (9%)]\tLoss: 0.208334\n",
      "Train Epoch: 1 [90/938 (10%)]\tLoss: 0.092803\n",
      "Train Epoch: 1 [100/938 (11%)]\tLoss: 0.009891\n",
      "Train Epoch: 1 [110/938 (12%)]\tLoss: 0.153850\n",
      "Train Epoch: 1 [120/938 (13%)]\tLoss: 0.062122\n",
      "Train Epoch: 1 [130/938 (14%)]\tLoss: 0.055835\n",
      "Train Epoch: 1 [140/938 (15%)]\tLoss: 0.114874\n",
      "Train Epoch: 1 [150/938 (16%)]\tLoss: 0.135059\n",
      "Train Epoch: 1 [160/938 (17%)]\tLoss: 0.209164\n",
      "Train Epoch: 1 [170/938 (18%)]\tLoss: 0.200797\n",
      "Train Epoch: 1 [180/938 (19%)]\tLoss: 0.118919\n",
      "Train Epoch: 1 [190/938 (20%)]\tLoss: 0.196783\n",
      "Train Epoch: 1 [200/938 (21%)]\tLoss: 0.242684\n",
      "Train Epoch: 1 [210/938 (22%)]\tLoss: 0.413652\n",
      "Train Epoch: 1 [220/938 (23%)]\tLoss: 0.108963\n",
      "Train Epoch: 1 [230/938 (25%)]\tLoss: 0.530779\n",
      "Train Epoch: 1 [240/938 (26%)]\tLoss: 0.111462\n",
      "Train Epoch: 1 [250/938 (27%)]\tLoss: 0.233948\n",
      "Train Epoch: 1 [260/938 (28%)]\tLoss: 0.096871\n",
      "Train Epoch: 1 [270/938 (29%)]\tLoss: 0.005476\n",
      "Train Epoch: 1 [280/938 (30%)]\tLoss: 0.136239\n",
      "Train Epoch: 1 [290/938 (31%)]\tLoss: 0.086216\n",
      "Train Epoch: 1 [300/938 (32%)]\tLoss: 0.320376\n",
      "Train Epoch: 1 [310/938 (33%)]\tLoss: 0.056435\n",
      "Train Epoch: 1 [320/938 (34%)]\tLoss: 0.088900\n",
      "Train Epoch: 1 [330/938 (35%)]\tLoss: 0.077269\n",
      "Train Epoch: 1 [340/938 (36%)]\tLoss: 0.222857\n",
      "Train Epoch: 1 [350/938 (37%)]\tLoss: 0.090470\n",
      "Train Epoch: 1 [360/938 (38%)]\tLoss: 0.181398\n",
      "Train Epoch: 1 [370/938 (39%)]\tLoss: 0.258413\n",
      "Train Epoch: 1 [380/938 (41%)]\tLoss: 0.044568\n",
      "Train Epoch: 1 [390/938 (42%)]\tLoss: 0.208491\n",
      "Train Epoch: 1 [400/938 (43%)]\tLoss: 0.024349\n",
      "Train Epoch: 1 [410/938 (44%)]\tLoss: 0.097962\n",
      "Train Epoch: 1 [420/938 (45%)]\tLoss: 0.035660\n",
      "Train Epoch: 1 [430/938 (46%)]\tLoss: 0.319142\n",
      "Train Epoch: 1 [440/938 (47%)]\tLoss: 0.112544\n",
      "Train Epoch: 1 [450/938 (48%)]\tLoss: 0.284870\n",
      "Train Epoch: 1 [460/938 (49%)]\tLoss: 0.283764\n",
      "Train Epoch: 1 [470/938 (50%)]\tLoss: 0.250175\n",
      "Train Epoch: 1 [480/938 (51%)]\tLoss: 0.157756\n",
      "Train Epoch: 1 [490/938 (52%)]\tLoss: 0.071510\n",
      "Train Epoch: 1 [500/938 (53%)]\tLoss: 0.296052\n",
      "Train Epoch: 1 [510/938 (54%)]\tLoss: 0.063261\n",
      "Train Epoch: 1 [520/938 (55%)]\tLoss: 0.087280\n",
      "Train Epoch: 1 [530/938 (57%)]\tLoss: 0.102561\n",
      "Train Epoch: 1 [540/938 (58%)]\tLoss: 0.083404\n",
      "Train Epoch: 1 [550/938 (59%)]\tLoss: 0.052055\n",
      "Train Epoch: 1 [560/938 (60%)]\tLoss: 0.044225\n",
      "Train Epoch: 1 [570/938 (61%)]\tLoss: 0.080570\n",
      "Train Epoch: 1 [580/938 (62%)]\tLoss: 0.167150\n",
      "Train Epoch: 1 [590/938 (63%)]\tLoss: 0.137994\n",
      "Train Epoch: 1 [600/938 (64%)]\tLoss: 0.314702\n",
      "Train Epoch: 1 [610/938 (65%)]\tLoss: 0.386576\n",
      "Train Epoch: 1 [620/938 (66%)]\tLoss: 0.154651\n",
      "Train Epoch: 1 [630/938 (67%)]\tLoss: 0.211713\n",
      "Train Epoch: 1 [640/938 (68%)]\tLoss: 0.201374\n",
      "Train Epoch: 1 [650/938 (69%)]\tLoss: 0.070127\n",
      "Train Epoch: 1 [660/938 (70%)]\tLoss: 0.095240\n",
      "Train Epoch: 1 [670/938 (71%)]\tLoss: 0.051987\n",
      "Train Epoch: 1 [680/938 (72%)]\tLoss: 0.142315\n",
      "Train Epoch: 1 [690/938 (74%)]\tLoss: 0.090122\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 1 [700/938 (75%)]\tLoss: 0.104628\n",
      "Train Epoch: 1 [710/938 (76%)]\tLoss: 0.116404\n",
      "Train Epoch: 1 [720/938 (77%)]\tLoss: 0.059856\n",
      "Train Epoch: 1 [730/938 (78%)]\tLoss: 0.346445\n",
      "Train Epoch: 1 [740/938 (79%)]\tLoss: 0.057055\n",
      "Train Epoch: 1 [750/938 (80%)]\tLoss: 0.070142\n",
      "Train Epoch: 1 [760/938 (81%)]\tLoss: 0.148698\n",
      "Train Epoch: 1 [770/938 (82%)]\tLoss: 0.042575\n",
      "Train Epoch: 1 [780/938 (83%)]\tLoss: 0.131458\n",
      "Train Epoch: 1 [790/938 (84%)]\tLoss: 0.023700\n",
      "Train Epoch: 1 [800/938 (85%)]\tLoss: 0.268284\n",
      "Train Epoch: 1 [810/938 (86%)]\tLoss: 0.011392\n",
      "Train Epoch: 1 [820/938 (87%)]\tLoss: 0.170202\n",
      "Train Epoch: 1 [830/938 (88%)]\tLoss: 0.137273\n",
      "Train Epoch: 1 [840/938 (90%)]\tLoss: 0.100842\n",
      "Train Epoch: 1 [850/938 (91%)]\tLoss: 0.057559\n",
      "Train Epoch: 1 [860/938 (92%)]\tLoss: 0.163903\n",
      "Train Epoch: 1 [870/938 (93%)]\tLoss: 0.270894\n",
      "Train Epoch: 1 [880/938 (94%)]\tLoss: 0.110774\n",
      "Train Epoch: 1 [890/938 (95%)]\tLoss: 0.142618\n",
      "Train Epoch: 1 [900/938 (96%)]\tLoss: 0.187053\n",
      "Train Epoch: 1 [910/938 (97%)]\tLoss: 0.151790\n",
      "Train Epoch: 1 [920/938 (98%)]\tLoss: 0.018912\n",
      "Train Epoch: 1 [930/938 (99%)]\tLoss: 0.183618\n",
      "Test Epoch: 1 [0/157 (0%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [10/157 (6%)]\tAcc: 0.921875\n",
      "Test Epoch: 1 [20/157 (13%)]\tAcc: 0.921875\n",
      "Test Epoch: 1 [30/157 (19%)]\tAcc: 0.953125\n",
      "Test Epoch: 1 [40/157 (25%)]\tAcc: 0.921875\n",
      "Test Epoch: 1 [50/157 (32%)]\tAcc: 0.968750\n",
      "Test Epoch: 1 [60/157 (38%)]\tAcc: 0.937500\n",
      "Test Epoch: 1 [70/157 (45%)]\tAcc: 0.953125\n",
      "Test Epoch: 1 [80/157 (51%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [90/157 (57%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [100/157 (64%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [110/157 (70%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [120/157 (76%)]\tAcc: 1.000000\n",
      "Test Epoch: 1 [130/157 (83%)]\tAcc: 0.984375\n",
      "Test Epoch: 1 [140/157 (89%)]\tAcc: 0.953125\n",
      "Test Epoch: 1 [150/157 (96%)]\tAcc: 0.953125\n",
      "Total test acc = 0.9671\n",
      "Train Epoch: 2 [0/938 (0%)]\tLoss: 0.085735\n",
      "Train Epoch: 2 [10/938 (1%)]\tLoss: 0.130465\n",
      "Train Epoch: 2 [20/938 (2%)]\tLoss: 0.027238\n",
      "Train Epoch: 2 [30/938 (3%)]\tLoss: 0.116073\n",
      "Train Epoch: 2 [40/938 (4%)]\tLoss: 0.187502\n",
      "Train Epoch: 2 [50/938 (5%)]\tLoss: 0.065617\n",
      "Train Epoch: 2 [60/938 (6%)]\tLoss: 0.093609\n",
      "Train Epoch: 2 [70/938 (7%)]\tLoss: 0.104410\n",
      "Train Epoch: 2 [80/938 (9%)]\tLoss: 0.095942\n",
      "Train Epoch: 2 [90/938 (10%)]\tLoss: 0.282522\n",
      "Train Epoch: 2 [100/938 (11%)]\tLoss: 0.091899\n",
      "Train Epoch: 2 [110/938 (12%)]\tLoss: 0.142710\n",
      "Train Epoch: 2 [120/938 (13%)]\tLoss: 0.051769\n",
      "Train Epoch: 2 [130/938 (14%)]\tLoss: 0.071588\n",
      "Train Epoch: 2 [140/938 (15%)]\tLoss: 0.021449\n",
      "Train Epoch: 2 [150/938 (16%)]\tLoss: 0.006790\n",
      "Train Epoch: 2 [160/938 (17%)]\tLoss: 0.055043\n",
      "Train Epoch: 2 [170/938 (18%)]\tLoss: 0.359066\n",
      "Train Epoch: 2 [180/938 (19%)]\tLoss: 0.086634\n",
      "Train Epoch: 2 [190/938 (20%)]\tLoss: 0.030564\n",
      "Train Epoch: 2 [200/938 (21%)]\tLoss: 0.155594\n",
      "Train Epoch: 2 [210/938 (22%)]\tLoss: 0.446819\n",
      "Train Epoch: 2 [220/938 (23%)]\tLoss: 0.040492\n",
      "Train Epoch: 2 [230/938 (25%)]\tLoss: 0.122431\n",
      "Train Epoch: 2 [240/938 (26%)]\tLoss: 0.127685\n",
      "Train Epoch: 2 [250/938 (27%)]\tLoss: 0.066049\n",
      "Train Epoch: 2 [260/938 (28%)]\tLoss: 0.092976\n",
      "Train Epoch: 2 [270/938 (29%)]\tLoss: 0.057877\n",
      "Train Epoch: 2 [280/938 (30%)]\tLoss: 0.124391\n",
      "Train Epoch: 2 [290/938 (31%)]\tLoss: 0.054755\n",
      "Train Epoch: 2 [300/938 (32%)]\tLoss: 0.097547\n",
      "Train Epoch: 2 [310/938 (33%)]\tLoss: 0.151855\n",
      "Train Epoch: 2 [320/938 (34%)]\tLoss: 0.093891\n",
      "Train Epoch: 2 [330/938 (35%)]\tLoss: 0.104686\n",
      "Train Epoch: 2 [340/938 (36%)]\tLoss: 0.256665\n",
      "Train Epoch: 2 [350/938 (37%)]\tLoss: 0.290896\n",
      "Train Epoch: 2 [360/938 (38%)]\tLoss: 0.207254\n",
      "Train Epoch: 2 [370/938 (39%)]\tLoss: 0.167920\n",
      "Train Epoch: 2 [380/938 (41%)]\tLoss: 0.025714\n",
      "Train Epoch: 2 [390/938 (42%)]\tLoss: 0.049858\n",
      "Train Epoch: 2 [400/938 (43%)]\tLoss: 0.038995\n",
      "Train Epoch: 2 [410/938 (44%)]\tLoss: 0.033156\n",
      "Train Epoch: 2 [420/938 (45%)]\tLoss: 0.063976\n",
      "Train Epoch: 2 [430/938 (46%)]\tLoss: 0.295632\n",
      "Train Epoch: 2 [440/938 (47%)]\tLoss: 0.028926\n",
      "Train Epoch: 2 [450/938 (48%)]\tLoss: 0.026876\n",
      "Train Epoch: 2 [460/938 (49%)]\tLoss: 0.035151\n",
      "Train Epoch: 2 [470/938 (50%)]\tLoss: 0.043150\n",
      "Train Epoch: 2 [480/938 (51%)]\tLoss: 0.099015\n",
      "Train Epoch: 2 [490/938 (52%)]\tLoss: 0.156179\n",
      "Train Epoch: 2 [500/938 (53%)]\tLoss: 0.157619\n",
      "Train Epoch: 2 [510/938 (54%)]\tLoss: 0.140651\n",
      "Train Epoch: 2 [520/938 (55%)]\tLoss: 0.176397\n",
      "Train Epoch: 2 [530/938 (57%)]\tLoss: 0.099402\n",
      "Train Epoch: 2 [540/938 (58%)]\tLoss: 0.035010\n",
      "Train Epoch: 2 [550/938 (59%)]\tLoss: 0.287024\n",
      "Train Epoch: 2 [560/938 (60%)]\tLoss: 0.135259\n",
      "Train Epoch: 2 [570/938 (61%)]\tLoss: 0.020481\n",
      "Train Epoch: 2 [580/938 (62%)]\tLoss: 0.071563\n",
      "Train Epoch: 2 [590/938 (63%)]\tLoss: 0.041979\n",
      "Train Epoch: 2 [600/938 (64%)]\tLoss: 0.053910\n",
      "Train Epoch: 2 [610/938 (65%)]\tLoss: 0.105802\n",
      "Train Epoch: 2 [620/938 (66%)]\tLoss: 0.077079\n",
      "Train Epoch: 2 [630/938 (67%)]\tLoss: 0.072032\n",
      "Train Epoch: 2 [640/938 (68%)]\tLoss: 0.164553\n",
      "Train Epoch: 2 [650/938 (69%)]\tLoss: 0.020185\n",
      "Train Epoch: 2 [660/938 (70%)]\tLoss: 0.164906\n",
      "Train Epoch: 2 [670/938 (71%)]\tLoss: 0.160516\n",
      "Train Epoch: 2 [680/938 (72%)]\tLoss: 0.185206\n",
      "Train Epoch: 2 [690/938 (74%)]\tLoss: 0.252789\n",
      "Train Epoch: 2 [700/938 (75%)]\tLoss: 0.058496\n",
      "Train Epoch: 2 [710/938 (76%)]\tLoss: 0.082438\n",
      "Train Epoch: 2 [720/938 (77%)]\tLoss: 0.200533\n",
      "Train Epoch: 2 [730/938 (78%)]\tLoss: 0.011665\n",
      "Train Epoch: 2 [740/938 (79%)]\tLoss: 0.093606\n",
      "Train Epoch: 2 [750/938 (80%)]\tLoss: 0.093081\n",
      "Train Epoch: 2 [760/938 (81%)]\tLoss: 0.036109\n",
      "Train Epoch: 2 [770/938 (82%)]\tLoss: 0.038048\n",
      "Train Epoch: 2 [780/938 (83%)]\tLoss: 0.078773\n",
      "Train Epoch: 2 [790/938 (84%)]\tLoss: 0.054961\n",
      "Train Epoch: 2 [800/938 (85%)]\tLoss: 0.035109\n",
      "Train Epoch: 2 [810/938 (86%)]\tLoss: 0.150152\n",
      "Train Epoch: 2 [820/938 (87%)]\tLoss: 0.025836\n",
      "Train Epoch: 2 [830/938 (88%)]\tLoss: 0.077902\n",
      "Train Epoch: 2 [840/938 (90%)]\tLoss: 0.154891\n",
      "Train Epoch: 2 [850/938 (91%)]\tLoss: 0.181755\n",
      "Train Epoch: 2 [860/938 (92%)]\tLoss: 0.068052\n",
      "Train Epoch: 2 [870/938 (93%)]\tLoss: 0.223926\n",
      "Train Epoch: 2 [880/938 (94%)]\tLoss: 0.024089\n",
      "Train Epoch: 2 [890/938 (95%)]\tLoss: 0.268356\n",
      "Train Epoch: 2 [900/938 (96%)]\tLoss: 0.029194\n",
      "Train Epoch: 2 [910/938 (97%)]\tLoss: 0.030891\n",
      "Train Epoch: 2 [920/938 (98%)]\tLoss: 0.037380\n",
      "Train Epoch: 2 [930/938 (99%)]\tLoss: 0.146263\n",
      "Test Epoch: 2 [0/157 (0%)]\tAcc: 1.000000\n",
      "Test Epoch: 2 [10/157 (6%)]\tAcc: 0.953125\n",
      "Test Epoch: 2 [20/157 (13%)]\tAcc: 0.968750\n",
      "Test Epoch: 2 [30/157 (19%)]\tAcc: 0.953125\n",
      "Test Epoch: 2 [40/157 (25%)]\tAcc: 0.984375\n",
      "Test Epoch: 2 [50/157 (32%)]\tAcc: 0.953125\n",
      "Test Epoch: 2 [60/157 (38%)]\tAcc: 0.984375\n",
      "Test Epoch: 2 [70/157 (45%)]\tAcc: 0.937500\n",
      "Test Epoch: 2 [80/157 (51%)]\tAcc: 1.000000\n",
      "Test Epoch: 2 [90/157 (57%)]\tAcc: 0.984375\n",
      "Test Epoch: 2 [100/157 (64%)]\tAcc: 0.953125\n",
      "Test Epoch: 2 [110/157 (70%)]\tAcc: 0.984375\n",
      "Test Epoch: 2 [120/157 (76%)]\tAcc: 1.000000\n",
      "Test Epoch: 2 [130/157 (83%)]\tAcc: 0.984375\n",
      "Test Epoch: 2 [140/157 (89%)]\tAcc: 0.968750\n",
      "Test Epoch: 2 [150/157 (96%)]\tAcc: 0.968750\n",
      "Total test acc = 0.9747\n",
      "Train Epoch: 3 [0/938 (0%)]\tLoss: 0.029276\n",
      "Train Epoch: 3 [10/938 (1%)]\tLoss: 0.128718\n",
      "Train Epoch: 3 [20/938 (2%)]\tLoss: 0.114136\n",
      "Train Epoch: 3 [30/938 (3%)]\tLoss: 0.175863\n",
      "Train Epoch: 3 [40/938 (4%)]\tLoss: 0.119407\n",
      "Train Epoch: 3 [50/938 (5%)]\tLoss: 0.023124\n",
      "Train Epoch: 3 [60/938 (6%)]\tLoss: 0.069409\n",
      "Train Epoch: 3 [70/938 (7%)]\tLoss: 0.175537\n",
      "Train Epoch: 3 [80/938 (9%)]\tLoss: 0.044068\n",
      "Train Epoch: 3 [90/938 (10%)]\tLoss: 0.039270\n",
      "Train Epoch: 3 [100/938 (11%)]\tLoss: 0.041589\n",
      "Train Epoch: 3 [110/938 (12%)]\tLoss: 0.311189\n",
      "Train Epoch: 3 [120/938 (13%)]\tLoss: 0.048966\n",
      "Train Epoch: 3 [130/938 (14%)]\tLoss: 0.021020\n",
      "Train Epoch: 3 [140/938 (15%)]\tLoss: 0.123300\n",
      "Train Epoch: 3 [150/938 (16%)]\tLoss: 0.015196\n",
      "Train Epoch: 3 [160/938 (17%)]\tLoss: 0.086319\n",
      "Train Epoch: 3 [170/938 (18%)]\tLoss: 0.025925\n",
      "Train Epoch: 3 [180/938 (19%)]\tLoss: 0.026906\n",
      "Train Epoch: 3 [190/938 (20%)]\tLoss: 0.035199\n",
      "Train Epoch: 3 [200/938 (21%)]\tLoss: 0.156299\n",
      "Train Epoch: 3 [210/938 (22%)]\tLoss: 0.099553\n",
      "Train Epoch: 3 [220/938 (23%)]\tLoss: 0.092651\n",
      "Train Epoch: 3 [230/938 (25%)]\tLoss: 0.096245\n",
      "Train Epoch: 3 [240/938 (26%)]\tLoss: 0.075171\n",
      "Train Epoch: 3 [250/938 (27%)]\tLoss: 0.042659\n",
      "Train Epoch: 3 [260/938 (28%)]\tLoss: 0.346644\n",
      "Train Epoch: 3 [270/938 (29%)]\tLoss: 0.025780\n",
      "Train Epoch: 3 [280/938 (30%)]\tLoss: 0.065534\n",
      "Train Epoch: 3 [290/938 (31%)]\tLoss: 0.055503\n",
      "Train Epoch: 3 [300/938 (32%)]\tLoss: 0.265311\n",
      "Train Epoch: 3 [310/938 (33%)]\tLoss: 0.254793\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 3 [320/938 (34%)]\tLoss: 0.045063\n",
      "Train Epoch: 3 [330/938 (35%)]\tLoss: 0.058299\n",
      "Train Epoch: 3 [340/938 (36%)]\tLoss: 0.205273\n",
      "Train Epoch: 3 [350/938 (37%)]\tLoss: 0.016032\n",
      "Train Epoch: 3 [360/938 (38%)]\tLoss: 0.037333\n",
      "Train Epoch: 3 [370/938 (39%)]\tLoss: 0.089765\n",
      "Train Epoch: 3 [380/938 (41%)]\tLoss: 0.062916\n",
      "Train Epoch: 3 [390/938 (42%)]\tLoss: 0.140819\n",
      "Train Epoch: 3 [400/938 (43%)]\tLoss: 0.084308\n",
      "Train Epoch: 3 [410/938 (44%)]\tLoss: 0.223716\n",
      "Train Epoch: 3 [420/938 (45%)]\tLoss: 0.018608\n",
      "Train Epoch: 3 [430/938 (46%)]\tLoss: 0.040922\n",
      "Train Epoch: 3 [440/938 (47%)]\tLoss: 0.091088\n",
      "Train Epoch: 3 [450/938 (48%)]\tLoss: 0.100574\n",
      "Train Epoch: 3 [460/938 (49%)]\tLoss: 0.031961\n",
      "Train Epoch: 3 [470/938 (50%)]\tLoss: 0.044045\n",
      "Train Epoch: 3 [480/938 (51%)]\tLoss: 0.019030\n",
      "Train Epoch: 3 [490/938 (52%)]\tLoss: 0.056948\n",
      "Train Epoch: 3 [500/938 (53%)]\tLoss: 0.066515\n",
      "Train Epoch: 3 [510/938 (54%)]\tLoss: 0.127204\n",
      "Train Epoch: 3 [520/938 (55%)]\tLoss: 0.068011\n",
      "Train Epoch: 3 [530/938 (57%)]\tLoss: 0.170617\n",
      "Train Epoch: 3 [540/938 (58%)]\tLoss: 0.085911\n",
      "Train Epoch: 3 [550/938 (59%)]\tLoss: 0.040213\n",
      "Train Epoch: 3 [560/938 (60%)]\tLoss: 0.071809\n",
      "Train Epoch: 3 [570/938 (61%)]\tLoss: 0.100353\n",
      "Train Epoch: 3 [580/938 (62%)]\tLoss: 0.088990\n",
      "Train Epoch: 3 [590/938 (63%)]\tLoss: 0.017604\n",
      "Train Epoch: 3 [600/938 (64%)]\tLoss: 0.069384\n",
      "Train Epoch: 3 [610/938 (65%)]\tLoss: 0.050279\n",
      "Train Epoch: 3 [620/938 (66%)]\tLoss: 0.099423\n",
      "Train Epoch: 3 [630/938 (67%)]\tLoss: 0.087007\n",
      "Train Epoch: 3 [640/938 (68%)]\tLoss: 0.123801\n",
      "Train Epoch: 3 [650/938 (69%)]\tLoss: 0.108569\n",
      "Train Epoch: 3 [660/938 (70%)]\tLoss: 0.015272\n",
      "Train Epoch: 3 [670/938 (71%)]\tLoss: 0.058114\n",
      "Train Epoch: 3 [680/938 (72%)]\tLoss: 0.051281\n",
      "Train Epoch: 3 [690/938 (74%)]\tLoss: 0.056625\n",
      "Train Epoch: 3 [700/938 (75%)]\tLoss: 0.024394\n",
      "Train Epoch: 3 [710/938 (76%)]\tLoss: 0.229214\n",
      "Train Epoch: 3 [720/938 (77%)]\tLoss: 0.157146\n",
      "Train Epoch: 3 [730/938 (78%)]\tLoss: 0.057152\n",
      "Train Epoch: 3 [740/938 (79%)]\tLoss: 0.170796\n",
      "Train Epoch: 3 [750/938 (80%)]\tLoss: 0.005900\n",
      "Train Epoch: 3 [760/938 (81%)]\tLoss: 0.206662\n",
      "Train Epoch: 3 [770/938 (82%)]\tLoss: 0.020888\n",
      "Train Epoch: 3 [780/938 (83%)]\tLoss: 0.102198\n",
      "Train Epoch: 3 [790/938 (84%)]\tLoss: 0.156167\n",
      "Train Epoch: 3 [800/938 (85%)]\tLoss: 0.118774\n",
      "Train Epoch: 3 [810/938 (86%)]\tLoss: 0.094498\n",
      "Train Epoch: 3 [820/938 (87%)]\tLoss: 0.084717\n",
      "Train Epoch: 3 [830/938 (88%)]\tLoss: 0.113925\n",
      "Train Epoch: 3 [840/938 (90%)]\tLoss: 0.054973\n",
      "Train Epoch: 3 [850/938 (91%)]\tLoss: 0.109440\n",
      "Train Epoch: 3 [860/938 (92%)]\tLoss: 0.052542\n",
      "Train Epoch: 3 [870/938 (93%)]\tLoss: 0.081913\n",
      "Train Epoch: 3 [880/938 (94%)]\tLoss: 0.034008\n",
      "Train Epoch: 3 [890/938 (95%)]\tLoss: 0.055243\n",
      "Train Epoch: 3 [900/938 (96%)]\tLoss: 0.026066\n",
      "Train Epoch: 3 [910/938 (97%)]\tLoss: 0.081119\n",
      "Train Epoch: 3 [920/938 (98%)]\tLoss: 0.155930\n",
      "Train Epoch: 3 [930/938 (99%)]\tLoss: 0.056044\n",
      "Test Epoch: 3 [0/157 (0%)]\tAcc: 1.000000\n",
      "Test Epoch: 3 [10/157 (6%)]\tAcc: 0.953125\n",
      "Test Epoch: 3 [20/157 (13%)]\tAcc: 0.968750\n",
      "Test Epoch: 3 [30/157 (19%)]\tAcc: 0.968750\n",
      "Test Epoch: 3 [40/157 (25%)]\tAcc: 0.937500\n",
      "Test Epoch: 3 [50/157 (32%)]\tAcc: 0.953125\n",
      "Test Epoch: 3 [60/157 (38%)]\tAcc: 0.953125\n",
      "Test Epoch: 3 [70/157 (45%)]\tAcc: 0.937500\n",
      "Test Epoch: 3 [80/157 (51%)]\tAcc: 0.968750\n",
      "Test Epoch: 3 [90/157 (57%)]\tAcc: 1.000000\n",
      "Test Epoch: 3 [100/157 (64%)]\tAcc: 1.000000\n",
      "Test Epoch: 3 [110/157 (70%)]\tAcc: 0.984375\n",
      "Test Epoch: 3 [120/157 (76%)]\tAcc: 0.984375\n",
      "Test Epoch: 3 [130/157 (83%)]\tAcc: 1.000000\n",
      "Test Epoch: 3 [140/157 (89%)]\tAcc: 0.937500\n",
      "Test Epoch: 3 [150/157 (96%)]\tAcc: 0.921875\n",
      "Total test acc = 0.9661\n",
      "Train Epoch: 4 [0/938 (0%)]\tLoss: 0.033561\n",
      "Train Epoch: 4 [10/938 (1%)]\tLoss: 0.023106\n",
      "Train Epoch: 4 [20/938 (2%)]\tLoss: 0.232753\n",
      "Train Epoch: 4 [30/938 (3%)]\tLoss: 0.014634\n",
      "Train Epoch: 4 [40/938 (4%)]\tLoss: 0.068259\n",
      "Train Epoch: 4 [50/938 (5%)]\tLoss: 0.036399\n",
      "Train Epoch: 4 [60/938 (6%)]\tLoss: 0.011522\n",
      "Train Epoch: 4 [70/938 (7%)]\tLoss: 0.017262\n",
      "Train Epoch: 4 [80/938 (9%)]\tLoss: 0.017650\n",
      "Train Epoch: 4 [90/938 (10%)]\tLoss: 0.252838\n",
      "Train Epoch: 4 [100/938 (11%)]\tLoss: 0.067233\n",
      "Train Epoch: 4 [110/938 (12%)]\tLoss: 0.010737\n",
      "Train Epoch: 4 [120/938 (13%)]\tLoss: 0.027090\n",
      "Train Epoch: 4 [130/938 (14%)]\tLoss: 0.003570\n",
      "Train Epoch: 4 [140/938 (15%)]\tLoss: 0.001152\n",
      "Train Epoch: 4 [150/938 (16%)]\tLoss: 0.004174\n",
      "Train Epoch: 4 [160/938 (17%)]\tLoss: 0.044346\n",
      "Train Epoch: 4 [170/938 (18%)]\tLoss: 0.017931\n",
      "Train Epoch: 4 [180/938 (19%)]\tLoss: 0.069598\n",
      "Train Epoch: 4 [190/938 (20%)]\tLoss: 0.071746\n",
      "Train Epoch: 4 [200/938 (21%)]\tLoss: 0.076535\n",
      "Train Epoch: 4 [210/938 (22%)]\tLoss: 0.100941\n",
      "Train Epoch: 4 [220/938 (23%)]\tLoss: 0.021138\n",
      "Train Epoch: 4 [230/938 (25%)]\tLoss: 0.088135\n",
      "Train Epoch: 4 [240/938 (26%)]\tLoss: 0.117837\n",
      "Train Epoch: 4 [250/938 (27%)]\tLoss: 0.032977\n",
      "Train Epoch: 4 [260/938 (28%)]\tLoss: 0.167049\n",
      "Train Epoch: 4 [270/938 (29%)]\tLoss: 0.013822\n",
      "Train Epoch: 4 [280/938 (30%)]\tLoss: 0.045409\n",
      "Train Epoch: 4 [290/938 (31%)]\tLoss: 0.119697\n",
      "Train Epoch: 4 [300/938 (32%)]\tLoss: 0.067969\n",
      "Train Epoch: 4 [310/938 (33%)]\tLoss: 0.131902\n",
      "Train Epoch: 4 [320/938 (34%)]\tLoss: 0.066060\n",
      "Train Epoch: 4 [330/938 (35%)]\tLoss: 0.066008\n",
      "Train Epoch: 4 [340/938 (36%)]\tLoss: 0.184514\n",
      "Train Epoch: 4 [350/938 (37%)]\tLoss: 0.063161\n",
      "Train Epoch: 4 [360/938 (38%)]\tLoss: 0.093329\n",
      "Train Epoch: 4 [370/938 (39%)]\tLoss: 0.066812\n",
      "Train Epoch: 4 [380/938 (41%)]\tLoss: 0.059804\n",
      "Train Epoch: 4 [390/938 (42%)]\tLoss: 0.030450\n",
      "Train Epoch: 4 [400/938 (43%)]\tLoss: 0.008455\n",
      "Train Epoch: 4 [410/938 (44%)]\tLoss: 0.062510\n",
      "Train Epoch: 4 [420/938 (45%)]\tLoss: 0.144027\n",
      "Train Epoch: 4 [430/938 (46%)]\tLoss: 0.031752\n",
      "Train Epoch: 4 [440/938 (47%)]\tLoss: 0.098326\n",
      "Train Epoch: 4 [450/938 (48%)]\tLoss: 0.073496\n",
      "Train Epoch: 4 [460/938 (49%)]\tLoss: 0.059776\n",
      "Train Epoch: 4 [470/938 (50%)]\tLoss: 0.029075\n",
      "Train Epoch: 4 [480/938 (51%)]\tLoss: 0.065083\n",
      "Train Epoch: 4 [490/938 (52%)]\tLoss: 0.072848\n",
      "Train Epoch: 4 [500/938 (53%)]\tLoss: 0.209735\n",
      "Train Epoch: 4 [510/938 (54%)]\tLoss: 0.059197\n",
      "Train Epoch: 4 [520/938 (55%)]\tLoss: 0.078309\n",
      "Train Epoch: 4 [530/938 (57%)]\tLoss: 0.046048\n",
      "Train Epoch: 4 [540/938 (58%)]\tLoss: 0.015106\n",
      "Train Epoch: 4 [550/938 (59%)]\tLoss: 0.119855\n",
      "Train Epoch: 4 [560/938 (60%)]\tLoss: 0.209653\n",
      "Train Epoch: 4 [570/938 (61%)]\tLoss: 0.016287\n",
      "Train Epoch: 4 [580/938 (62%)]\tLoss: 0.169566\n",
      "Train Epoch: 4 [590/938 (63%)]\tLoss: 0.022472\n",
      "Train Epoch: 4 [600/938 (64%)]\tLoss: 0.065485\n",
      "Train Epoch: 4 [610/938 (65%)]\tLoss: 0.036357\n",
      "Train Epoch: 4 [620/938 (66%)]\tLoss: 0.008508\n",
      "Train Epoch: 4 [630/938 (67%)]\tLoss: 0.058652\n",
      "Train Epoch: 4 [640/938 (68%)]\tLoss: 0.042606\n",
      "Train Epoch: 4 [650/938 (69%)]\tLoss: 0.012600\n",
      "Train Epoch: 4 [660/938 (70%)]\tLoss: 0.051655\n",
      "Train Epoch: 4 [670/938 (71%)]\tLoss: 0.016207\n",
      "Train Epoch: 4 [680/938 (72%)]\tLoss: 0.023592\n",
      "Train Epoch: 4 [690/938 (74%)]\tLoss: 0.046827\n",
      "Train Epoch: 4 [700/938 (75%)]\tLoss: 0.169964\n",
      "Train Epoch: 4 [710/938 (76%)]\tLoss: 0.107680\n",
      "Train Epoch: 4 [720/938 (77%)]\tLoss: 0.054638\n",
      "Train Epoch: 4 [730/938 (78%)]\tLoss: 0.048630\n",
      "Train Epoch: 4 [740/938 (79%)]\tLoss: 0.003170\n",
      "Train Epoch: 4 [750/938 (80%)]\tLoss: 0.042371\n",
      "Train Epoch: 4 [760/938 (81%)]\tLoss: 0.108998\n",
      "Train Epoch: 4 [770/938 (82%)]\tLoss: 0.029650\n",
      "Train Epoch: 4 [780/938 (83%)]\tLoss: 0.147029\n",
      "Train Epoch: 4 [790/938 (84%)]\tLoss: 0.031367\n",
      "Train Epoch: 4 [800/938 (85%)]\tLoss: 0.016677\n",
      "Train Epoch: 4 [810/938 (86%)]\tLoss: 0.194396\n",
      "Train Epoch: 4 [820/938 (87%)]\tLoss: 0.060913\n",
      "Train Epoch: 4 [830/938 (88%)]\tLoss: 0.061074\n",
      "Train Epoch: 4 [840/938 (90%)]\tLoss: 0.038237\n",
      "Train Epoch: 4 [850/938 (91%)]\tLoss: 0.177125\n",
      "Train Epoch: 4 [860/938 (92%)]\tLoss: 0.093419\n",
      "Train Epoch: 4 [870/938 (93%)]\tLoss: 0.003814\n",
      "Train Epoch: 4 [880/938 (94%)]\tLoss: 0.016418\n",
      "Train Epoch: 4 [890/938 (95%)]\tLoss: 0.053389\n",
      "Train Epoch: 4 [900/938 (96%)]\tLoss: 0.053131\n",
      "Train Epoch: 4 [910/938 (97%)]\tLoss: 0.020287\n",
      "Train Epoch: 4 [920/938 (98%)]\tLoss: 0.010422\n",
      "Train Epoch: 4 [930/938 (99%)]\tLoss: 0.084738\n",
      "Test Epoch: 4 [0/157 (0%)]\tAcc: 1.000000\n",
      "Test Epoch: 4 [10/157 (6%)]\tAcc: 0.937500\n",
      "Test Epoch: 4 [20/157 (13%)]\tAcc: 0.953125\n",
      "Test Epoch: 4 [30/157 (19%)]\tAcc: 0.968750\n",
      "Test Epoch: 4 [40/157 (25%)]\tAcc: 0.953125\n",
      "Test Epoch: 4 [50/157 (32%)]\tAcc: 0.953125\n",
      "Test Epoch: 4 [60/157 (38%)]\tAcc: 0.968750\n",
      "Test Epoch: 4 [70/157 (45%)]\tAcc: 0.937500\n",
      "Test Epoch: 4 [80/157 (51%)]\tAcc: 1.000000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Epoch: 4 [90/157 (57%)]\tAcc: 1.000000\n",
      "Test Epoch: 4 [100/157 (64%)]\tAcc: 1.000000\n",
      "Test Epoch: 4 [110/157 (70%)]\tAcc: 1.000000\n",
      "Test Epoch: 4 [120/157 (76%)]\tAcc: 1.000000\n",
      "Test Epoch: 4 [130/157 (83%)]\tAcc: 0.984375\n",
      "Test Epoch: 4 [140/157 (89%)]\tAcc: 0.953125\n",
      "Test Epoch: 4 [150/157 (96%)]\tAcc: 0.968750\n",
      "Total test acc = 0.98\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 训练函数\n",
    "def train(model, train_loader, loss_function, optimizer, epoch):\n",
    "    model.train()                                                       # 开启训练模式\n",
    "    train_losses = list()                                              # 初始化 Loss 容器，用于记录每一批次的 Loss\n",
    "    for batch_idx, (inputs, targets) in enumerate(train_loader):       # 通过训练集加载器，按批次迭代数据\n",
    "        outputs = model(inputs)                                        # 通过模型预测手写数字。outputs 中每个数据输出有 10 个分量，对应十个数字的相似度\n",
    "        loss = loss_function(outputs, targets)                         # 计算损失函数\n",
    "        optimizer.step(loss)                                           # 根据损失函数，对模型参数进行优化、更新\n",
    "        train_losses.append(loss)                                      # 记录该批次的 Loss\n",
    "        \n",
    "        if batch_idx % 10 == 0:                                        # 每十个批次，打印一次训练集上的 Loss \n",
    "            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n",
    "                    epoch, batch_idx, len(train_loader),\n",
    "                    100. * batch_idx / len(train_loader), loss.data[0]))\n",
    "    return train_losses                                                # 返回本纪元的 Loss\n",
    "\n",
    "\n",
    "# 测试函数\n",
    "def test(model, val_loader, loss_function, epoch):\n",
    "    model.eval()                                                       # 开启训练模式\n",
    "    total_correct = 0                                                  # 本纪元预测正确总次数                                \n",
    "    total_num = 0                                                      # 本纪元数据总数\n",
    "    for batch_idx, (inputs, targets) in enumerate(val_loader):         # 通过测试集加载器，按批次迭代数据\n",
    "        outputs = model(inputs)                                        # 通过模型预测手写数字。outputs 中每个数据输出有 10 个分量，对应十个数字的相似度\n",
    "        pred = np.argmax(outputs.data, axis=1)                         # 根据 10 个分量，选择最大相似度的为预测的数字值\n",
    "        correct = np.sum(targets.data==pred)                           # 计算本批次中，正确预测的次数，即数据标签等于预测值的数目\n",
    "        batch_size = inputs.shape[0]                                   # 计算本批次中，数据的总数目\n",
    "        acc = correct / batch_size                                     # 计算本批次的正确率\n",
    "        \n",
    "        total_correct += correct                                       # 将本批次的正确预测次数记录到总数中\n",
    "        total_num += batch_size                                        # 将本批次的数据数目记录到总数中\n",
    "        \n",
    "        if batch_idx % 10 == 0:                                        # 每十个批次，打印一次测试集上的准确率\n",
    "            print('Test Epoch: {} [{}/{} ({:.0f}%)]\\tAcc: {:.6f}'.format(epoch, \\\n",
    "                        batch_idx, len(val_loader),100. * float(batch_idx) / len(val_loader), acc))\n",
    "    test_acc = total_correct / total_num                               # 计算本纪元的正确率\n",
    "    print ('Total test acc =', test_acc)              \n",
    "    return test_acc\n",
    "\n",
    "\n",
    "# 设置纪元数，并开始训练和测试模型\n",
    "epochs = 5\n",
    "train_losses = list()\n",
    "test_acc = list()\n",
    "for epoch in range(epochs):\n",
    "    loss = train(model, train_loader, loss_function, optimizer, epoch) # 训练模型，并返回该纪元的 Loss 列表\n",
    "    train_losses += loss\n",
    "    acc = test(model, val_loader, loss_function, epoch)                # 测试模型，并返回该纪元的正确率\n",
    "    test_acc.append(acc)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.5 可视化验证"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模型训练完毕。最后，我们利用可视化工具，直观感受下我们的训练结果吧！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **训练集: Loss 下降趋势**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(train_losses, label=\"Training Loss\")\n",
    "plt.xlabel(\"Iterations\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **测试集: 正确率上升状况**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(test_acc, label=\"Test Accuracy\")\n",
    "plt.xlabel(\"Epochs\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **模型预测效果**  \n",
    "\n",
    "我们在测试集上观看一下预测效果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAOF0lEQVR4nO3da6xV9ZnH8d9PxqpRjBzJIFK0F020qUonBE1sJowNjZJ4jfGS2DiJDJXoqKGRIcyLkugLM0yp80o8TYloqk2TltQXximDJt6SKhjk4qXYeql45IjGFFRE4JkXZ2FO9ez/Puy1b5zn+0lOzt7r2WuvJxt+Z+29/nutvyNCACa+o3rdAIDuIOxAEoQdSIKwA0kQdiCJf+jmxmxz6B/osIjwWMtr7dltX2z7Nduv215a57kAdJZbHWe3PUnSnyTNk/SOpBckXR8RLxfWYc8OdFgn9uxzJL0eEX+JiH2Sfi3p8hrPB6CD6oR9hqS/jrr/TrXs79heaHuD7Q01tgWgpo4foIuIQUmDEm/jgV6qs2ffIWnmqPtfr5YB6EN1wv6CpDNtf9P21yRdJ+nR9rQFoN1afhsfEftt3yrpfyVNkrQ6Ira1rTMAbdXy0FtLG+MzO9BxHflSDYAjB2EHkiDsQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJAg7kARhB5Ig7EAShB1IgrADSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJEHYgiZbnZ5ck229K2i3pgKT9ETG7HU0BaL9aYa/8S0TsasPzAOgg3sYDSdQNe0j6g+2NtheO9QDbC21vsL2h5rYA1OCIaH1le0ZE7LD9j5LWSfr3iHiq8PjWNwZgXCLCYy2vtWePiB3V72FJayXNqfN8ADqn5bDbPt725EO3Jf1Q0tZ2NQagveocjZ8maa3tQ8/zcEQ83pauALRdrc/sh70xPrMDHdeRz+wAjhyEHUiCsANJEHYgCcIOJNGOE2FwBDvjjDOK9alTpxbrV155ZbE+d+7chrWDBw8W1121alWx/txzzxXr27dvL9azYc8OJEHYgSQIO5AEYQeSIOxAEoQdSIKwA0lw1tsEcM455zSs3XLLLcV1r7rqqmK92Th7L+3fv79Yf+211xrWnnnmmeK6t99+e7G+b9++Yr2XOOsNSI6wA0kQdiAJwg4kQdiBJAg7kARhB5LgfPY+cO655xbrzcbKr7322oa1E088saWeDtmxY0ex/vTTTxfrb7zxRsPakiVLiutu3LixWJ8zpzwnycDAQMPa/Pnzi+u+9NJLxXqzc+37EXt2IAnCDiRB2IEkCDuQBGEHkiDsQBKEHUiC89m74P777y/Wm117vc455evXry/Wt2zZUqwvW7asWN+7d+9h93TIk08+WawvWrSoWF+9enWxPmvWrIa1nTt3Ftc97bTTivVTTjmlWH///feL9U5q+Xx226ttD9veOmrZgO11trdXv6e0s1kA7Teet/EPSLr4S8uWSlofEWdKWl/dB9DHmoY9Ip6S9OGXFl8uaU11e42kK9rcF4A2a/W78dMiYqi6/Z6kaY0eaHuhpIUtbgdAm9Q+ESYionTgLSIGJQ1KeQ/QAf2g1aG3nbanS1L1e7h9LQHohFbD/qikG6vbN0r6fXvaAdApTd/G235E0lxJU22/I+mnku6R9BvbN0l6S9I1nWyyHxx77LENa83Oy16wYEGxbo85LPqFZmO29913X8PaihUriut+/PHHxXonnXzyycX6pEmTivXly5cX648//njD2umnn15cdyJqGvaIuL5B6Qdt7gVAB/F1WSAJwg4kQdiBJAg7kARhB5LgUtLjNHfu3Ia1O++8s7hus6G1d999t1hvNq3y888/X6x3UrPhsZkzZzasPfjgg8V1H3vssWJ9ypTWT7Zs9m/y0EMPFesfffRRy9vuFfbsQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AE4+zjVBpPPnDgQK3n/vzzz4v1888/v1i/+uqrG9bOOuuslno65NNPPy3Wzz777Jbru3btKq47bVrDq53V1uxS0nfffXex3uzfrB+xZweSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJJiyeZyOO+64hrWHH364uO68efNafm5JOuqo8t/kOv+Gzb4j0Ox89V46ePBgsb527dqGtdtuu6247tDQULHez1qeshnAxEDYgSQIO5AEYQeSIOxAEoQdSIKwA0kwzt4FJ510UrG+dOnSYv3CCy8s1j/44IOGtbfffru47jHHHFOsn3feecX6nDlzivVOWrVqVbG+bNmyhrUj8brv49XyOLvt1baHbW8dtWy57R22N1U/89vZLID2G8/b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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "target: 9\n",
      "prediction: 9\n"
     ]
    }
   ],
   "source": [
    "num = 9                                                       # 选择查看第几个数据的验证效果\n",
    "for inputs, targets in val_loader:                          \n",
    "    \n",
    "    plt.imshow(inputs[num].numpy().transpose(1, 2, 0))        # 绘制该数据的手写数字图像\n",
    "    plt.show()                                              \n",
    "    \n",
    "    print(\"target:\", targets[num].data[0])                    # 打印该数据的真实标签值\n",
    "    \n",
    "    outputs = model(inputs)                                   # 模型根据输入数据进行预测\n",
    "    pred = np.argmax(outputs.data, axis=1)                    # 根据最大相似度得到预测值\n",
    "    print(\"prediction:\", pred[num])                           # 打印该数据的预测值\n",
    "    break"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 尾声 📣\n",
    "\n",
    "恭喜您，已经完成了计图入门教程的所有内容。  \n",
    "现在，您已经是一名合格的计图使用者了。  \n",
    "计图官方时常会举办一些 “人工智能算法挑战赛” ，并附赠丰厚的奖金回报。作为一名合格的计图使用者，请来大赛中斩获一席之地吧！🎉🎊🎈\n",
    "\n",
    "更多学习资料，可以参考：\n",
    "\n",
    "*  [在线PyTorch转Jittor工具](https://cg.cs.tsinghua.edu.cn/jittor/news/2020-12-13-20-40-pt_converter/)\n",
    "*  [PyTorch模型转换指南](https://cg.cs.tsinghua.edu.cn/jittor/tutorial/2020-5-2-16-43-pytorchconvert/)\n",
    "*  [Jittor文档](https://cg.cs.tsinghua.edu.cn/jittor/assets/docs/index.html)\n",
    "*  [Jittor模型库](https://cg.cs.tsinghua.edu.cn/jittor/resources/)\n",
    "*  [Jittor教程](https://cg.cs.tsinghua.edu.cn/jittor/tutorial/)\n",
    "\n",
    "Jittor还很年轻。 它可能存在错误和问题。 请在我们的错误跟踪系统，QQ群（761222083）中报告它们。 我们欢迎您为Jittor做出贡献。\n",
    "\n",
    "您可以用以下方式帮助Jittor：\n",
    "\n",
    "* 在论文中引用 Jittor\n",
    "* 向身边的好朋友推荐 Jittor\n",
    "* 贡献代码\n",
    "* 贡献教程和文档\n",
    "* 提出issue\n",
    "* 回答 jittor 相关问题\n",
    "* 点亮小星星\n",
    "* 持续关注 jittor\n",
    "\n",
    "[Jittor Github 地址](https://github.com/jittor/jittor), \n",
    "[Jittor Gitee 地址](https://gitee.com/jittor/jittor)\n",
    "\n",
    "求star～您的支持是对我们最大的鼓励！\n",
    "\n",
    "![image.png](attachment:image.png)\n",
    "\n",
    "特别感谢本教程作者：llt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
